#pragma once

#include "google/protobuf/service.h"
#include "muduo/net/TcpConnection.h"
#include "muduo/base/Timestamp.h"
#include "muduo/net/InetAddress.h"
#include "muduo/net/EventLoop.h"
#include <muduo/net/TcpServer.h>
#include "mprpcapplication.h"
#include <google/protobuf/descriptor.h>
#include "unordered_map"
#include "rpcheader.pb.h"
#include "zookeeperhelper.h"

// 框架提供的专门用于发布rpc服务到网络上的网络对象类
class RpcProvider {
public:
    // 框架提供给外部的用来发布rpc方法的函数接口，接受参数不能是具体的类，框架不能关心业务
    void NotifyService(google::protobuf::Service *service);
    // 启动rpc服务节点，开始提供rpc远程网络调用服务
    void Run();
private:
    muduo::net::EventLoop m_eventloop;

    // service服务类型信息
    struct ServiceInfo
    {
        google::protobuf::Service *m_service; // 保存服务对象
        std::unordered_map<std::string, const google::protobuf::MethodDescriptor*> m_methodMap; // 保存服务方法
    };

    // 存储注册成功的服务对象和其服务方法的所有信息
    std::unordered_map<std::string, ServiceInfo> m_serviceMap;

    void onConnection(const muduo::net::TcpConnectionPtr&);
    void onMessage(const muduo::net::TcpConnectionPtr&, muduo::net::Buffer*, muduo::Timestamp);
    // Closure的回调操作，用于序列化rpc的响应和网络发送
    void SendRpcResponse(const muduo::net::TcpConnectionPtr&, google::protobuf::Message*);
};
